/**
 * 地图查询
 */
import sgisRegionBase from "./sgis.region.base.js";
const sgisSpatial = {
  // 空间查询
  spatialQueryUtil: {
    // 数据集几何查询(iserver sql查询),根据区划信息查询区划代码对应的features(******)
    /**
    {
      id: "510000000000",   // 必选
      rcid: "59bf9428a772b7d9705d4acd", // 可选
      regioncode: "510000000000", // 可选
      regionname: "四川省", // 可选
      regiontype: "1", // 1普通区划 2高新区 3特色区 // 可选
      regionlevel: "2", // 可选
      origincode: "510000000000", // 可选
      parcode: "000000000000", // 可选
      lat: "", // 可选
      lon: "", // 可选
      rname: "ST_R_SH", // 可选
      pname: "ST_P_SH" // 可选
    }
     * @param {Array} regionInfos 区划信息
     * @param {String} type  区划类型
     * @param {Function} callback 查询回调
     */
    getFeaturesByRegionCodes(regionInfos, type, callback) {
      //
      let dataSource = sgisRegionBase.regionCatalog.getCurrDataSource();
      let options = {};
      if (type !== "1") {
        // 1普通区划 2高新区 3 特色区划
        // 如果存在多个特色区划的时候每个特色区划对应的数据集（dataSetName）可能不同需要做一下合并分批查询
        options = {};
      } else {
        let regioncodes = sgisRegionBase.regionUtils.getRegionCodesByRegionInfos(
          regionInfos
        );
        if (regioncodes.length < 1) {
          // 如果没有区划代码直接return 掉
          return;
        }
        // 区划等级一致所以区划所在面一致
        let regionlevel = sgisRegionBase.regionUtils.getRegionLevel(
          regioncodes[0]
        );
        let dataSetName = sgisRegionBase.regionUtils.getDataSetNameByRegionLevel(
          regionlevel
        );
        options = {
          queryParameter: {
            name: dataSetName + ":" + dataSource,
            attributeFilter: this.getSqlConditionsByRegionCodes(regioncodes)
          },
          datasetNames: [dataSource + ":" + dataSetName]
        }; // 查询数据集名称 // 查询数据集名称
        this.getFeaturesBySql(options, callback);
      }
    },
    /**
     * sql 查询 features
     * @param {OBject} options 查询条件
     * @param {Function} callback 回调方法
     */
    getFeaturesBySql(options, callback) {
      let params = new SuperMap.GetFeaturesBySQLParameters(options);
      L.supermap
        .featureService(sgisRegionBase.regionCatalog.getCurrDataService())
        .getFeaturesBySQL(params, function(serviceResult) {
          if (typeof callback === "function") {
            callback(serviceResult);
          }
        });
    },
    /**
     * 根据区划代码获取sqlCondition
     * @param {Array} regioncodes 区划代码数组
     */
    getSqlConditionsByRegionCodes(regioncodes) {
      let sql = "";
      if (regioncodes != null) {
        for (let i = 0, size = regioncodes.length; i < size; i++) {
          if (regioncodes[i].indexOf("#") !== -1) {
            if (i === size - 1) {
              sql +=
                "QH_CODE like '" +
                sgisRegionBase.regionUtils.getPrefixCode(regioncodes[i]) +
                "%' ";
            } else {
              sql +=
                "QH_CODE like '" +
                sgisRegionBase.regionUtils.getPrefixCode(regioncodes[i]) +
                "%' or ";
            }
          } else {
            if (i === size - 1) sql += "QH_CODE ='" + regioncodes[i] + "' ";
            else sql += "QH_CODE ='" + regioncodes[i] + "' or ";
          }
        }
      }
      return sql;
    }
  },
  /**
   * 根据条件查询区划信息，只返回属性信息(******)
   * 查询的点数据集
   * @param {String} dataSetName 数据集名称(ST_P)
   * @param {String} dataSourceName 数据源名称
   * @param {String} sqlCondition 查询过滤条件
   * @param {Function} callback 回调函数
   */
  queryAttributeBySQL(dataSetName, dataSourceName, sqlCondition, callback) {
    let option = {
      name: dataSetName + "@" + dataSourceName,
      attributeFilter: sqlCondition
    };
    let queryParameter = new SuperMap.FilterParameter(option);
    let queryBySQLParams = new SuperMap.QueryBySQLParameters({
      queryParams: [queryParameter],
      queryOption: SuperMap.QueryOption.ATTRIBUTE // 只返回属性信息
    });
    L.supermap
      .queryService(sgisRegionBase.regionCatalog.getCurrQueryService())
      .queryBySQL(
        queryBySQLParams,
        function(serviceResult) {
          if (typeof callback === "function") {
            callback(serviceResult);
          }
        },
        SuperMap.DataFormat.GEOJSON
      );
  },

  /**
   *  空间查询(******)
   * @param {Object} geometry 空间图形对象 L.polygo L.circle L.reactangle等图形
   * @param {String} dataSetName 数据集名称
   * @param {String} callback 回调函数
   */
  spatialQuery(geometry, dataSetName, callback) {
    this._geometryQuery(
      geometry,
      dataSetName,
      SuperMap.SpatialQueryMode.INTERSECT,
      callback
    );
  },
  /**
   *  邻域查询(******)
   * @param {Object} geometry 空间图形对象 L.polygo L.circle L.reactangle等图形
   * @param {String} dataSetName 数据集名称
   * @param {Function} callback 回调函数
   */
  cicinityQuery(geometry, dataSetName, callback) {
    this._geometryQuery(
      geometry,
      dataSetName, // SuperMap.SpatialQueryMode.TOUCH,
      SuperMap.SpatialQueryMode.INTERSECT,
      callback
    );
  },
  /**
   *  缓冲分析(******)
   * @param {Object} geometry 空间图形对象 L.polygo L.circle L.reactangle等图形
   * @param {String} dataSetName 数据集名称
   * @param {Number} bufferDistance 缓冲距离
   * @param {Function} callback 回调函数
   * 返回缓冲图层
   */
  bufferQuery(geometry, dataSetName, bufferDistance, callback) {
    let spatialUrl = sgisRegionBase.regionCatalog.getCurrAnalysisService();
    let bufferAnalystService = L.supermap.spatialAnalystService(spatialUrl);
    // 对生成的线路进行缓冲区分析
    let geoBufferAnalystParams = new SuperMap.GeometryBufferAnalystParameters({
      sourceGeometry: geometry,
      bufferSetting: new SuperMap.BufferSetting({
        endType: SuperMap.BufferEndType.ROUND,
        leftDistance: new SuperMap.BufferDistance({
          value: bufferDistance
        }),
        rightDistance: new SuperMap.BufferDistance({
          value: bufferDistance
        }),
        semicircleLineSegment: 30
      })
    });
    bufferAnalystService.bufferAnalysis(geoBufferAnalystParams, function(
      serviceResult
    ) {
      callback(dataSetName, serviceResult);
    });
  },
  _geometryQuery(geometry, dataSetName, spatialQueryMode, callback) {
    // 获取当亲数据源名称
    let dataSourceName = sgisRegionBase.regionCatalog.getCurrDataSource();
    // 获取当前数据服务地址
    let dataServiceUrl = sgisRegionBase.regionCatalog.getCurrDataService();
    // 构造空间查询参数
    let geometryParam = new SuperMap.GetFeaturesByGeometryParameters({
      datasetNames: [dataSourceName + ":" + dataSetName],
      geometry: geometry,
      maxFeatures: 999999999, // 查询最大数目 不知道为什么只能设置这么多，多了会报400错误
      fromIndex: 0,
      toIndex: 9999999999,
      spatialQueryMode: spatialQueryMode
    });
    // 开始查询
    L.supermap
      .featureService(dataServiceUrl)
      .getFeaturesByGeometry(geometryParam, function(serviceResult) {
        // 执行查询回调
        if (typeof callback === "function") {
          callback(serviceResult);
        }
      });
  }
};
export default sgisSpatial;
